/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Model;
import Model.Token;
import Controller.Compilador;
import java.util.*;

/**
 *
 * @author PedroSkype
 */


public class Sintatico {

Token TAtual = new Token();
String Erro = new String();

    public void checaBlocosObrigatorios(){
    checaBlocoRegistro();
    checaBlocoConstante();
    checaBlocoVariavel();
    }
    public boolean checaBlocoConstante(){

if(TAtual.getLexema().equals("constantes")) {
        TAtual = nextToken();
            
    if(TAtual.getLexema().equals("{")) {
            TAtual = nextToken();
            while(!TAtual.getLexema().equals("}")){
            declaracao_constantes();
                if(TAtual.getLexema().equals("variaveis")){
                 Erro = "#}# Expected"; 
                 return false; 
                }
            } 
                 TAtual = nextToken();
                 return true;
    } else { Erro = "#{# Expected"; 
             return false;}
 } else { Erro = "#BLOCO Constante# Expected"; acabaCompilacao (); } 
    } //fecha metodo checaBlocosObrigatorios    
    
    
    void acabaCompilacao () {
    //METODO PARA ACABAR COMPILAÇÃO
    
    }
    
    boolean declaracao_constantes(){
    if(this.tipo()){
        if (this.identificador()){
           if(TAtual.getLexema().equals("=")){
               TAtual = nextToken(); 
               if(this.valor()){
                 if(TAtual.getLexema().equals(";")){
                     TAtual = nextToken();
                     return true;
                 } else {Erro = "#;# Expected"; return false;}
               } else { return false;}
           } else {Erro = "="; return false;}
        } else { return false;}
    } else {return false;}
    
    } //fecha declaracao_constante();
    
    boolean tipo(){
        if(TAtual.getLexema().equals("inteiro") || TAtual.getLexema().equals("real") || 
        TAtual.getLexema().equals("booleano") || TAtual.getLexema().equals("cadeia") ||
        TAtual.getLexema().equals("char")){
            
            TAtual = nextToken(); 
            return true;
            
            }else  Erro = "#Tipo# Expected"; return false; 
    } //fecha tipo();
    
    boolean letra(char a){
    if(a == 'a' || a == 'i' || a == 'q' || a == 'z' || a == 'G' || a == 'N' || a == 'U' || 
       a == 'b' || a == 'j' || a == 'r' || a == 'A' || a == 'H' || a == 'O' || a == 'W' || 
       a == 'c' || a == 'k' || a == 's' || a == 'B' || a == 'I' || a == 'P' || a == 'X' || 
       a == 'd' || a == 'l' || a == 't' || a == 'C' || a == 'J' || a == 'Q' || a == 'Y' || 
       a == 'e' || a == 'm' || a == 'u' || a == 'D' || a == 'K' || a == 'R' || a == 'Z' || 
       a == 'f' || a == 'n' || a == 'w' || a == 'E' || a == 'L' || a == 'S' || 
       a == 'g' || a == 'o' || a == 'x' || a == 'F' || a == 'M' || a == 'T' ){ return true;
    
    } else return false;
    } // fecha letra ();
    
    boolean digito(char a){
    if(a == '1' || a == '2' || a == '3' || a == '4' || a == '5' || 
       a == '6' || a == '7' || a == '8' || a == '9' || a == '0' ){ return true;
    
    } else return false;
    } // fecha numero ();
    
    boolean identificador() {
    String lexema = TAtual.getLexema();
    int size = lexema.length();
    int i = 0;
    if(! letra( lexema.charAt(i) ) ){Erro = "#Identificador# Expected"; return false; }
    i++;
    while(i < size){
        
        if(! letra( lexema.charAt(i) ) || ! digito( lexema.charAt(i) ) ){
            Erro = "#Identificador# Expected"; 
            return false;
        }
        i++;
    }
    TAtual = nextToken();
    return true;
    } //fecha identificador();
    
    boolean reservada_logica() {
        if(TAtual.getLexema().equals("verdadeiro") || TAtual.getLexema().equals("falso") ) {
            TAtual = nextToken();
            return true;
        } else {
        Erro = "#Boolean# Expected"; 
        return false;
        } 
    
    } //fecha reservada logica
    
    boolean numero() {
   String lexema = TAtual.getLexema();
    int size = lexema.length();
    int i = 0;
    while(i < size){
        if(! digito( lexema.charAt(i) ) ){
            Erro = "#Numero# Expected"; 
            return false;
        }
        i++;
    }
    TAtual = nextToken();
    return true;
    } //fecha numero();
    
    boolean valor() {
    
        if(reservada_logica() || identificador() || numero() || 
        TAtual.getTipo().equals("Cadeia_constante") || 
        TAtual.getTipo().equals(" Caractere_Constante")){
        
         TAtual = nextToken();
        return true;
    } else { Erro = "#id || numero || cadeia || char || boolean# Expected"; return false;}
        
    //criando as assinaturas    
    } //fecha valor();
} //fecha classe
